<?php

namespace app\common\model\redis;

/**
 *  Redis锁操作模型
 *
 *  Func:
 *  public  lock    获取锁
 *  public  unlock  释放锁
 *  private connect 连接
 */
class RedisLock
{


    /**
     * 获取锁
     * @param String $key 锁标识
     * @param Int $expire 锁过期时间
     * @return Boolean
     */
    public static function lock(string $key, int $expire = 5): bool
    {
        $redis = redis()->handler();
        $is_lock = $redis->setnx($key, time() + $expire);

        // 不能获取锁
        if (!$is_lock) {

            // 判断锁是否过期
            $lock_time = $redis->get($key);

            // 锁已过期，删除锁，重新获取
            if (time() > $lock_time) {
                self::unlock($key);
                $is_lock = $redis->setnx($key, time() + $expire);
            }
        }

        return $is_lock ? true : false;
    }

    /**
     * 释放锁
     * @param String $key 锁标识
     * @return Boolean
     */
    public static function unlock(string $key): bool
    {
        $redis = redis()->handler();
        return $redis->del($key);
    }


}

